package com.yupi.generator;

import cn.hutool.Hutool;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import cn.hutool.core.util.ArrayUtil;

import java.io.File;
import java.io.IOException;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;

/**
 * 静态文件生成器
 */
public class StaticGenerator {

    public static void main(String[] args) {
        //获取整个项目的根目录
        String rootPath = System.getProperty("user.dir");
        //输入路径
        String inputPath = rootPath + File.separator + "hezi-generator-demo-projects" + File.separator + "acm-template";
        //输出路径
        String outputPath = rootPath;
        //拷贝文件
        copyFilesByRecursive(inputPath,outputPath);
    }

    /**
     * Hutool实现，将输入目录完整拷贝到输出目录中
     * @param inputPath    输入路径
     * @param outputPath    输出路径
     */
    public static void copyFileByHutool(String inputPath,String outputPath){
        FileUtil.copy(inputPath,outputPath,false);
    }


    /**
     * 递归实现，将输入目录完整拷贝到输出目录中
     * @param inputPath     输入路径
     * @param outputPath    输出路径
     */
    public static void copyFilesByRecursive(String inputPath, String outputPath) {
        File inputFile = new File(inputPath);
        File outputFile = new File(outputPath);
        try {
            copyFileByRecursive(inputFile,outputFile);
        }catch (Exception e){
            System.err.println("文件复制失败！");
            e.printStackTrace();
        }
    }

    /**
     * 文件A => 目录 B，则文件 A 放入目录 B 中
     * 文件A => 文件 B，则文件 A 覆盖文件 B
     * 目录A => 目录 B，则目录 A 复制到目录 B 中
     *
     * 核心思路：先创建目录，然后遍历目录内的文件，依次复制
     * @param inputFile     输入目录
     * @param outputFile    输出目录
     * @throws IOException
     */
    private static void copyFileByRecursive(File inputFile, File outputFile) throws IOException{
        //区分是输入路径是文件还是目录
        //若是目录，则递归拷贝到输出路径中
        if(inputFile.isDirectory() == true){
            File desOutputFile = new File(outputFile,inputFile.getName());
            if(false == desOutputFile.exists()){
                //目标为不存在路径，创建为目录
                desOutputFile.mkdirs();
            }
            //获取目录下的所有文件和子目录
            File[] files = inputFile.listFiles();
            //递归出口，若无子文件，直接结束
            if(ArrayUtil.isEmpty(files)){
                return;
            }
            for(File file : files){
                //递归拷贝到输出路径
                copyFileByRecursive(file,desOutputFile);
            }
        } else{
            //若是文件，直接拷贝到输出路径中
            Path destPath = outputFile.toPath().resolve(inputFile.getName());
            Files.copy(inputFile.toPath(),destPath,StandardCopyOption.REPLACE_EXISTING);
        }
    }
}
